package com.ld.admin.util.daliyNews;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang.math.RandomUtils;

import com.ld.admin.util.daliyNews.model.DaliyNewsModel;
import com.ld.shieldsb.common.core.cache.google.GoogleCacheUtil;
import com.ld.shieldsb.common.core.collections.ListUtils;
import com.ld.shieldsb.common.core.util.StringUtils;

public class DaliyNewsUtil {
    private static List<String> orderKeys = null;
    private static final String CACHE_KEY = "DaliyNewsCache";

    static {
        if (ListUtils.isEmpty(orderKeys)) {
            orderKeys = new ArrayList<>();
            Set<String> keys = DaliyNewsFactory.getInstance().getAllKey();
            orderKeys.addAll(keys);
        }
        GoogleCacheUtil.createCache(CACHE_KEY, 60 * 60 * 24L); // 缓存过期时间一天
    }

    /**
     * 传入类型下标获取每日新闻
     * 
     * @Title getDaliyNews
     * @author 吕凯
     * @date 2020年1月8日 上午8:24:06
     * @param type
     * @return String
     */
    public static String getDaliyNews(int type) {
        return getDaliyNews(type, true);
    }

    public static String getDaliyNews(int type, boolean useCache) {
        String content = "";
        if (type >= orderKeys.size()) { // 超出范围取最后一个
            type = orderKeys.size() - 1;
        }
        content = getDaliyNewsContent(orderKeys.get(type), useCache);
        return content;
    }

    /**
     * 根据服务类型获取新闻html内容[第一张新闻的]
     * 
     * @Title getDaliyNewsContent
     * @author 吕凯
     * @date 2020年3月30日 上午10:55:55
     * @param type
     * @return String
     */
    public static String getDaliyNewsContent(String type) {
        return getDaliyNewsContent(type, true);
    }

    public static String getDaliyNewsContent(String type, boolean useCache) {
        String content = "";
        DaliyNewsModel model = getDaliyNewsModel(type, 1, useCache);
        if (model != null) {
            content = model.getNewss().get(0).getHtmlContent();
        }
        return content;
    }

    /**
     * 
     * 传入类型下标获取每日新闻
     * 
     * @Title getDaliyNewsModel
     * @author 吕凯
     * @date 2020年7月3日 下午2:33:06
     * @param type
     * @return DaliyNewsModel
     */
    public static DaliyNewsModel getDaliyNewsModel(int type) {
        return getDaliyNewsModel(type, true);
    }

    public static DaliyNewsModel getDaliyNewsModel(int type, boolean useCache) {
        DaliyNewsModel model = null;
        if (type >= orderKeys.size()) { // 超出范围取最后一个
            type = orderKeys.size() - 1;
        }
        model = getDaliyNewsModel(orderKeys.get(type), 1, useCache);
        return model;
    }

    /**
     * 
     * 根据服务类型获取新闻对象
     * 
     * @Title getDaliyNewsModel
     * @author 吕凯
     * @date 2020年7月3日 下午2:31:17
     * @param type
     * @return DaliyNewsModel
     */
    public static DaliyNewsModel getDaliyNewsModel(String type, int num, boolean useCache) {
        DaliyNewsModel model = null;
        if (StringUtils.isNotEmpty(type)) {
            String cacheKey = type + "_" + num; // 缓存的key
            if (useCache) {
                model = GoogleCacheUtil.get(CACHE_KEY, cacheKey); // 查找缓存
            }

            if (model == null) {
                model = DaliyNewsFactory.getInstance().getService(type).getNews(num);

                if (useCache) {
                    GoogleCacheUtil.put(CACHE_KEY, cacheKey, model); // 放入缓存
                }
            }

        }
        return model;
    }

    /**
     * 传入类型下标获取每日新闻
     * 
     * @Title getDaliyNewsModel
     * @author 吕凯
     * @date 2020年7月22日 上午10:19:12
     * @param type
     * @param num
     * @return DaliyNewsModel
     */
    public static DaliyNewsModel getDaliyNewsModel(int type, int num) {
        return getDaliyNewsModel(type, num, true);
    }

    public static DaliyNewsModel getDaliyNewsModel(int type, int num, boolean useCache) {
        DaliyNewsModel model = null;
        if (type >= orderKeys.size()) { // 超出范围取最后一个
            type = orderKeys.size() - 1;
        }
        model = getDaliyNewsModel(orderKeys.get(type), num, useCache);
        return model;
    }

    /**
     * 传入字符型的key获取每日新闻
     * 
     * @Title getDaliyNews
     * @author 吕凯
     * @date 2020年1月8日 上午10:51:23
     * @param type
     * @return String
     */
    public static String getDaliyNews(String type) {
        String content = "";
        if (!orderKeys.contains(type)) { // 如果不存在则默认取第一个
            type = orderKeys.get(0);
        }
        content = getDaliyNewsContent(type);
        return content;
    }

    /**
     * 获取随机新闻html内容
     * 
     * @Title getRandomNews
     * @author 吕凯
     * @date 2020年1月8日 上午10:59:27
     * @return String
     */
    public static String getRandomNews() {
        return getRandomNews(null);
    }

    /**
     * 传入指定的类型集合获取随机新闻html内容[获取第一张新闻的]
     * 
     * @Title getRandomNews
     * @author 吕凯
     * @date 2020年1月8日 下午3:49:56
     * @param keys
     * @return String
     */
    public static String getRandomNews(List<String> keys) {
        DaliyNewsModel model = getRandomNewsModel(keys, 1);

        String countent = null;
        if (model != null) {
            countent = model.getNewss().get(0).getHtmlContent();
        }
        return countent;
    }

    /**
     * 获取所有的keys
     * 
     * @Title getAllKeys
     * @author 吕凯
     * @date 2020年1月8日 下午4:30:14
     * @return List<String>
     */
    public static List<String> getAllKeys() {
        return orderKeys;
    }

    /**
     * 获取连接字符串
     * 
     * @Title getLinkedStr
     * @author 吕凯
     * @date 2020年7月3日 下午2:01:43
     * @param url
     * @param from
     * @return String
     */
    public static String getLinkedStr(String url, String from) {
        return "【来自<a href='" + url + "' target='_blank'>「" + from + "」</a>】";
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String content = getRandomNews();// getRandomNews(ImmutableList.of("时光网"));
        System.out.println(content);
        long end0 = System.currentTimeMillis();
        System.out.println(end0 - start);
        content = getRandomNews();// getRandomNews(ImmutableList.of("时光网"));
        System.out.println(content);
        long end1 = System.currentTimeMillis();
        System.out.println(end1 - end0);
    }

    /**
     * 获取一张随机新闻对象
     * 
     * @Title getRandomNews
     * @author 吕凯
     * @date 2020年1月8日 上午10:59:27
     * @return String
     */
    public static DaliyNewsModel getRandomNewsModel() {
        return getRandomNewsModel(1);
    }

    /**
     * 获取num张随机新闻对象
     * 
     * @Title getRandomNewsModel
     * @author 吕凯
     * @date 2020年7月22日 上午10:20:40
     * @param num
     * @return DaliyNewsModel
     */
    public static DaliyNewsModel getRandomNewsModel(int num) {
        return getRandomNewsModel(null, num);
    }

    /**
     * 传入指定的类型集合获取随机新闻对象
     * 
     * @Title getRandomNews
     * @author 吕凯
     * @date 2020年1月8日 下午3:49:56
     * @param keys
     * @return String
     */
    public static DaliyNewsModel getRandomNewsModel(List<String> keys, int num) {

        return getRandomNewsModel(keys, num, true);
    }

    public static DaliyNewsModel getRandomNewsModel(List<String> keys, int num, boolean useCache) {
        if (keys == null) {
            keys = orderKeys;
        } else { // 校验key是否还有效
            List<String> validKeys = new ArrayList<>();
            keys.forEach(key -> {
                if (orderKeys.contains(key)) {
                    validKeys.add(key);
                }
            });
            keys = validKeys;
        }

        DaliyNewsModel countentModel = null;
        if (ListUtils.isNotEmpty(keys)) {
            int typeSize = keys.size();
            int type = RandomUtils.nextInt(typeSize); // 随机数
            String key = keys.get(type);
//            key = "欧陆词典"; // 测试时写死    欧陆词典 时光网
            countentModel = getDaliyNewsModel(key, num, useCache);
            int times = 0;
            // 如果获取不到，则改用其他随机数，保证有返回内容
            while (countentModel == null && times < 3) { // 尝试3次,仍获取不到就放弃获取
                type = RandomUtils.nextInt(typeSize); // 随机数
                countentModel = getDaliyNewsModel(type);
                times++;
            }
        }
        return countentModel;
    }

}
